/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.servicio.impl;

import com.ec.medical.entidades.Cita;
import com.ec.medical.entidades.Prestador;
import com.ec.medical.enumeracion.EstadoCitaEnum;
import com.ec.medical.exepciones.CitaException;
import com.ec.medical.servicio.CitaServicioLocal;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@Stateless
public class CitaServicioImpl extends ServicioBase<Cita> implements CitaServicioLocal {

    private Logger LOG = Logger.getLogger(CitaServicioImpl.class.getName());

    public CitaServicioImpl() {
        super(Cita.class);
    }

    @Override
    public List<Cita> obtenerCitasPorPrestador(Prestador prestador, Date fechaDesde, EstadoCitaEnum estado) {
        Query query = em.createNamedQuery("Cita.findByPrestadorYFechaMinima");
        query.setParameter("codigoPrestador", prestador.getCodigoPrestador());
        query.setParameter("fechaCita", fechaDesde);
        query.setParameter("estado", estado);
        return query.getResultList();
    }

    @Override
    public List<Cita> obtenerCitasPorPrestador(Prestador prestador, Date fechaDesde, List<EstadoCitaEnum> estados) {
        Query query = em.createNamedQuery("Cita.findByPrestadorEstadosYFechaMinima");
        query.setParameter("codigoPrestador", prestador.getCodigoPrestador());
        query.setParameter("fechaCita", fechaDesde);
        query.setParameter("estado", estados);
        return query.getResultList();
    }

    @Override
    public Cita obtenerCitaPorCodigo(Cita cita) {
        return find(cita.getCodigoCita());
    }

    @Override
    public Cita cancelarCita(Cita cita) throws CitaException {
        try {
            cita.setEstado(EstadoCitaEnum.CAN);
            edit(cita);
            return cita;
        } catch (Exception e) {
            LOG.error("actualizar ERROR " + e);
            throw new CitaException("No se puede actualizar la cita");
        }
    }

    @Override
    public void actualizar(Cita cita) throws CitaException {
        try {
            edit(cita);
        } catch (Exception e) {
            LOG.error("actualizar ERROR " + e);
            throw new CitaException("No se puede actualizar la cita");
        }
    }

    public boolean validadDisponibilidadHorario(Cita cita) {
        List<Cita> listaCitas = obtenerCitasPorPrestadorEnFecha(cita.getPrestador(), cita.getFechaCita(), EstadoCitaEnum.ACT);
        for (Cita citaTmp : listaCitas) {
            if (citaTmp.getFechaCita().equals(cita.getFechaCita())
                    && ((cita.getHoraInicio().after(citaTmp.getHoraInicio()) && cita.getHoraInicio().before(citaTmp.getHoraFin()))
                    || (cita.getHoraFin().after(citaTmp.getHoraInicio()) && cita.getHoraFin().before(citaTmp.getHoraFin()))
                    || (cita.getHoraFin().equals(citaTmp.getHoraFin()) && cita.getHoraInicio().equals(citaTmp.getHoraInicio()))
                    || (cita.getHoraInicio().before(citaTmp.getHoraInicio()) && cita.getHoraFin().equals(citaTmp.getHoraFin()))
                    || (cita.getHoraInicio().before(citaTmp.getHoraInicio()) && cita.getHoraFin().after(citaTmp.getHoraFin())))) {

                return false;
            }
        }
        return true;
    }

    public void crearCita(Cita cita) throws CitaException {
        try {

            if (cita.getHoraInicio().equals(cita.getHoraFin()) || cita.getHoraInicio().after(cita.getHoraFin())) {
                throw new CitaException("El horario seleccionado no es correcto");
            }


            if (validadDisponibilidadHorario(cita)) {
                cita.setEstado(EstadoCitaEnum.ACT);
                create(cita);
            } else {
                throw new CitaException("El horario seleccionado no se encuentra disponible");
            }

        } catch (Exception e) {
            throw new CitaException(e.getMessage());
        }
    }

    public List<Cita> obtenerCitasPorPrestadorEnFecha(Prestador prestador, Date fechaActual, EstadoCitaEnum estado) {
        Query query = em.createNamedQuery("Cita.findByPrestadorEstadoYFecha");
        query.setParameter("fechaActual", fechaActual);
        query.setParameter("estado", estado);
        query.setParameter("codigoPrestador", prestador.getCodigoPrestador());
        return query.getResultList();
    }
}
